#include "cpu/exec/template-start.h"

#define instr call

make_helper(concat(call_i_, SUFFIX)) {
    // 取出后面指令的长度，len = 4
    int len = concat(decode_i_, SUFFIX)(eip + 1);
    // 堆栈操作
    reg_l(R_ESP) -= DATA_BYTE;  // 减就是往下走压栈，给返回地址留下空间
    MEM_W(reg_l(R_ESP), cpu.eip + len + 1);  // eip + len + 1就是下一条指令的地址

    // 源操作数是opcode后跟着的那个数
    cpu.eip += (DATA_TYPE_S)op_src->val;
    print_asm("call 0x%x", cpu.eip + len + 1);
    //返回该call指令总长度，最后会在外面再加上该值，正好满足指令：eip跳到下一条指令位置加上偏移量的位置
    return len + 1;
} 

// 用make_helper的话，等会要自己写译码函数了
make_helper(concat(call_rm_, SUFFIX))
{
    int len = concat(decode_rm_, SUFFIX)(eip + 1);
    reg_l(R_ESP) -= DATA_BYTE;
    MEM_W(reg_l(R_ESP), cpu.eip + len + 1);
    cpu.eip = (DATA_TYPE_S)op_src->val - len - 1;  // 注意减去len + 1，因为外面要加上
    print_asm_template1();
    return len + 1;
}

#include "cpu/exec/template-end.h"